package com.wang.service;

import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse;
import com.wang.bo.PayBo;
import com.wang.entity.Cart;
import com.wang.entity.PayInfo;
import com.wang.entity.Product;
import com.wang.mapper.CartMapper;
import com.wang.mapper.PayInfoMapper;
import com.wang.mapper.ProductMapper;
import com.wang.utils.OrderNo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @Classname PayService
 * @Description TODO
 * @Date 2024/10/18 14:03
 * @Created by pc
 */
@Service
public class PayService {

    @Value("${alipay.returnUrl}")
    private String returnUrl;

    @Resource
    private StringRedisTemplate stringRedisTemplate;
    @Resource
    private CartMapper cartMapper;
    @Resource
    private ProductMapper productMapper;
    @Resource
    private PayInfoMapper payInfoMapper;

    /*
    * 下单支付
    * */
    public Object pay(PayBo bo) throws Exception {
        // 生成订单号
        String orderNo = OrderNo.getOrderNo();
        System.out.println(orderNo);
        // 存redis   订单号为key   value 为用户id 20241018145022273  -- 21
        stringRedisTemplate.opsForValue().set(orderNo,bo.getUserId().toString());
        //调用支付宝的SDK中支付方法 最终由支付宝生一个支付的页面 我们去这个页面付钱 AlipayTradePagePayResponse
        AlipayTradePagePayResponse response = Factory.Payment
                // 选择网页平台支付
                .Page()
                // 调用支付方法 传递参数
                //      产品名称       订单号      支付总金额              调用的回调页面
                .pay(bo.getSubject(),orderNo, bo.getTotal().toString(), returnUrl);
        // 生成一个支付页面片段
        return response.body;
    }

    @Transactional(propagation = Propagation.REQUIRED)
    public void updatePayStatus(Map<String, String[]> map) {
        // 获取结算的订单号
        String orderNo = map.get("out_trade_no")[0];
        // 通过订单号 从redis中获取用户id
        Integer userId = Integer.parseInt(stringRedisTemplate.opsForValue().get(orderNo));
        // 根据用户id 去cart表中获取该用户结算了哪些商品 取决于用户id 和 checked状态
        List<Cart> caetBuyList = cartMapper.findCartByUserIdAndBuyed(userId);
        caetBuyList.forEach(cart -> {
            Integer productId = cart.getProductId();
            Integer quantity = cart.getQuantity();
            // 根据商品的id 去商品表 减少对应商品的库存
            Product product = productMapper.findById(productId);
            // 1.修改库存
            product.setStock(product.getStock() - quantity);
            // 更新到数据库
            productMapper.updateStock(product);
        });
        // 2.删除用户购物车中的信息
        cartMapper.delCartByUserIdAndBuyed(userId);
        // 3.添加支付订单信息
        PayInfo info = new PayInfo();
        info.setCreateTime(new Date());
        info.setUpdateTime(new Date());
        info.setUserId(userId);
        info.setOrderNo(Long.parseLong(orderNo));
        info.setPayPlatform(1);
        info.setPlatformStatus(map.get("trade_status")[0]);
        info.setPlatformNumber(map.get("trade_no")[0]);
        payInfoMapper.addPayInfo(info);
        // 4.删除redis中的缓存
        stringRedisTemplate.delete(orderNo);
    }
}
